package com.wfg.myshiro.realm;

import org.apache.shiro.authc.*;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.realm.AuthenticatingRealm;

/**
 * myshiro
 *
 * @Title: com.wfg.myshiro
 * @Date: 2020/12/26 0026 9:37
 * @Author: wfg
 * @Description: 父类只负责用户认证即登录
 * @Version:
 */
public class MyRealm1 extends AuthenticatingRealm {

    /**
     * 用户认证的方法:
     * @param authenticationToken 用户身份令牌 这里存放着用户的账号和密码
     * @return 登录成功后返回的用户信息,相等于session
     * @throws AuthenticationException 如果认证失败抛出各种异常
     * 这个方法不能手工调用,shiro自动调用
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
        String username = usernamePasswordToken.getUsername();
        char[] password = usernamePasswordToken.getPassword();
        System.out.println(username+"===="+new String(password));

        //不存在的账号
        if(!"admin".equals(username)&&!"zhangsan".equals(username)){
            throw new UnknownAccountException("没找到想要的账号");
        }
        //根据不同的情况进行往外逻辑判断抛出相应的异常既可
        if("zhangsan".equals(username)){
            throw new LockedAccountException("账号被锁定");
        }
        /**
         * 实际生产环境中我们这样的加密是没有意义的
         * 因为我们主要是在前段访问后端的时候,防止在中间截取或者篡改数据
         * shiro提供这个算法主要是为了在注册的时候使用
         * 我们这里就是为了学习,不太深究了
         */
        //针对页面输入的的密码进行加密
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher("MD5");
        hashedCredentialsMatcher.setHashIterations(2);
        this.setCredentialsMatcher(hashedCredentialsMatcher);
        //针对数据库密码进行加密
        SimpleHash simpleHash2 = new SimpleHash("MD5", "123456", "", 2);

        /**
         * 创建密码认证对象，有shiro 完成认证操作
         * 参数一: 用户名数据库或者前台页面传入的均可
         * 参数二:是从数据库中查询到的密码
         * 参数三:为当前realm的名字
         *
         *
         */
        return new SimpleAuthenticationInfo(username,simpleHash2,getName());
    }

    public static void main(String[] args) {
        /**
         * 参数一: 加密算法
         * 参数二: 加密数据
         * 参数三: 加密盐值,不同的盐值加密后的结果不一致
         * 参数四:加密次数
         */
        SimpleHash simpleHash = new SimpleHash("MD5", "123456", "", 1);
        System.out.println(simpleHash);
        SimpleHash simpleHash2 = new SimpleHash("MD5", "123456", "", 2);
        System.out.println(simpleHash2);
        SimpleHash simpleHash3 = new SimpleHash("MD5", "e10adc3949ba59abbe56e057f20f883e", "", 1);
        System.out.println(simpleHash3);
        SimpleHash simpleHash4 = new SimpleHash("MD5", "123456", "admin", 1);
        System.out.println(simpleHash4);
        SimpleHash simpleHash5 = new SimpleHash("MD5", "123456", "admin1", 1);
        System.out.println(simpleHash5);
    }
}
